home *** CD-ROM | disk | FTP | other *** search
/ Shareware Grab Bag / Shareware Grab Bag.iso / 090 / vmed.arc / ED5.CCC < prev    next >
Text File  |  1985-12-03  |  4KB  |  161 lines

  1. /*    Screen editor:    output format module
  2.  *
  3.  *    Module: ed5/ccc
  4.  *    Date: November 12, 1983
  5.  *    Changed: February 16, 1984
  6.  */
  7.  
  8. #include ed0
  9.  
  10. /* data global to this module */
  11.  
  12. /* auto horizontal scroll will require additions:
  13. #option zvar ON
  14. int    fmtlmar;    /* first column displayed
  15. #option zvar OFF
  16. fmtslm(n)    int n;    /* set left margin to 'n' */
  17.  
  18. /* define length of a tab character */
  19. char    fmttab;
  20.  
  21. /* define the current device and device width */
  22. char    fmtdev;    /* device -- YES/NO = LIST/CONSOLE */
  23. char    fmtwidth;    /* device width. LISTW/SCRNW1 */
  24.  
  25. /* fmtcol[i] is the first column at which
  26.  * buf[i] will be printed.
  27.  * fmtsub() and fmtlen() assume fmtcol[] is valid
  28.  * on entry.
  29.  */
  30. int    fmtcol[MAXLEN1];
  31.  
  32. /* direct output from this module to either the
  33.  * console or the list device.
  34.  */
  35. fmtassn(listflag)    char listflag;
  36. {     if (listflag == YES)     {
  37.          fmtdev = YES;
  38.          fmtwidth = LISTW;
  39.      }
  40.      else     {
  41.          fmtdev = NO;
  42.          fmtwidth = SCRNW1;
  43.      }
  44. }
  45.  
  46.  /* adjust fmtcol[] to prepare for calls on
  47.   * fmtout() and fmtlen()
  48.   *
  49.   * NOTE: this routine is needed for efficiency.
  50.   * Without fmtadj(), calls on fmtlen() become too slow.
  51.   */
  52.  fmtadj(buf,minind,maxind)     char *buf;     int minind,maxind;
  53.  {     int    k;
  54.  /* line always starts at left margin */
  55.      fmtcol[0] = 0;
  56.  /* start scanning at minind */
  57.      k = minind;
  58.      while (k < maxind)     {
  59.          if (buf[k] == CR)
  60.              break;
  61.          fmtcol[k+1]=fmtcol[k]+fmtlench(buf[k],fmtcol[k]);
  62.          ++k;
  63.      }
  64.  }
  65.  
  66.  /* return column at which buf[i] will be printed */
  67.  fmtlen(buf,i) char    *buf; int    i;
  68.  {     return(fmtcol[i]); }    /* -fmtlmar */
  69.  
  70.  /* print buf[i] ... buf[j-1] on current device so long
  71.   * as characters will not be printed in last column.
  72.   */
  73.  fmtsubs(buf,i,j) char    *buf; int    i,j;
  74.  {     int    k;
  75.      if (fmtcol[i] >= fmtwidth)        /* -fmtlmar */
  76.          return;
  77.      outxy(fmtcol[i],outgety());    /* position cursor */
  78.      while (i < j)     {
  79.          if (buf[i] == CR)
  80.              break;
  81.          if (fmtcol[i+1] > fmtwidth)    /* -fmtlmar */
  82.              break;
  83.          fmtoutch(buf[i],fmtcol[i]);    /* -fmtlmar */
  84.          ++i;
  85.      }
  86.      outdeol();    /* clear rest of line */
  87.  }
  88.  
  89.  /* print string which ends with CR or EOS to current
  90.   * device. Truncate the string if it is too long.
  91.   */
  92.  fmtsout(buf,offset)    char *buf;    int offset;
  93.  {     char    c;
  94.      int    col,k;
  95.      col = 0;                /* -fmtlmar */
  96.      while (c = *buf++)     {
  97.          if (c == CR)
  98.              break;
  99.          k = fmtlench(c,col);
  100.          if ((col+k+offset) > fmtwidth)
  101.              break;
  102.          fmtoutch(c,col);    /* only if positive */
  103.          col = col + k;
  104.      }
  105.  }
  106.  
  107.  /* return length of char c at column col */
  108.  fmtlench(c,col) char    c; int    col;
  109.  {     if (c == TAB)     {
  110.          /* tab every fmttab columns */
  111.          return(fmttab - (col%fmttab));
  112.      }
  113.      else if (c < 32)     {
  114.          /* control char */
  115.          return(2);
  116.          }
  117.      else    return(1);
  118.  }
  119.  
  120.  /* output one character to current device.
  121.   * convert tabs to blanks.
  122.   */
  123.  fmtoutch(c,col) char    c; int    col;
  124.  {     int    k;
  125.      if (c == TAB)     {
  126.          k = fmtlench(TAB,col);
  127.          while ((k--) > 0 )
  128.              fmtdevch(' ');        /* if (++col > 0) ... */
  129.      }
  130.      else if (c < 32) {
  131.          fmtdevch('^');          /* same test ... */
  132.          fmtdevch(c + 64);       /* same test ... */
  133.      }
  134.      else    fmtdevch(c);        /* same test ... */
  135.  }
  136.  
  137.  /* output character to current device */
  138.  fmtdevch(c) char    c;
  139.  {     if(fmtdev == YES)
  140.          syslout(c);
  141.      else    outchar(c);
  142.  }
  143.  
  144.  /* output a CR and LF to the current device */
  145.  fmtcrlf()
  146.  {     if (fmtdev == YES)
  147.          syslout(CR);
  148.      else     {
  149.          /* kludge: this should be in out module */
  150.          /* make sure out module knows position */
  151.          outxy(0,SCRNL1);
  152.          syscout(CR);
  153.      }
  154.  }
  155.  
  156.  /* set tabs at every n columns */
  157.  fmtset(n) char    n;
  158.  {     fmttab = max(1,n); }
  159.  
  160. /* end module ed5/ccc */
  161.